/* 
 * FreeRTOS V6.0.2 - Copyright (C) 2010 Real Time Engineers Ltd.
 *
 * ***************************************************************************
 * * * * If you are: * * * * + New to FreeRTOS, * * + Wanting to learn FreeRTOS
 * or multitasking in general quickly * * + Looking for basic training, * * +
 * Wanting to improve your FreeRTOS skills and productivity * * * * then take a
 * look at the FreeRTOS eBook * * * * "Using the FreeRTOS Real Time Kernel - a
 * Practical Guide" * * http://www.FreeRTOS.org/Documentation * * * * A pdf
 * reference manual is also available.  Both are usually delivered * * to your
 * inbox within 20 minutes to two hours when purchased between 8am * * and 8pm
 * GMT (although please allow up to 24 hours in case of * * exceptional
 * circumstances).  Thank you for your support! * * *
 * ***************************************************************************
 *
 * This file is part of the FreeRTOS distribution.
 *
 * FreeRTOS is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License (version 2) as published by the
 * Free Software Foundation AND MODIFIED BY the FreeRTOS exception. ***NOTE***
 * The exception to the GPL is included to allow you to distribute a combined
 * work that includes FreeRTOS without being obliged to provide the source code
 * for proprietary components outside of the FreeRTOS kernel. FreeRTOS is
 * distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 * You should have received a copy of the GNU General Public License and the
 * FreeRTOS license exception along with FreeRTOS; if not it can be viewed
 * here: http://www.freertos.org/a00114.html and also obtained by writing to
 * Richard Barry, contact details for whom are available on the FreeRTOS WEB
 * site.
 *
 * 1 tab == 4 spaces!
 *
 * http://www.FreeRTOS.org - Documentation, latest information, license and
 * contact details.
 *
 * http://www.SafeRTOS.com - A version that is certified for use in safety
 * critical systems.
 *
 * http://www.OpenRTOS.com - Commercial support, development, porting,
 * licensing and training services. */

#ifndef PORTMACRO_H
#define PORTMACRO_H

/*-----------------------------------------------------------
 * Port specific definitions.
 *
 * The settings in this file configure FreeRTOS correctly for the
 * given hardware and compiler.
 *
 * These settings should not be altered.
 *-----------------------------------------------------------
 */

/* Type definitions. */
#define portCHAR		char
#define portFLOAT		float
#define portDOUBLE		double
#define portLONG		long
#define portSHORT		int
#define portSTACK_TYPE	unsigned portSHORT
#define portBASE_TYPE	portSHORT

#if( configUSE_16_BIT_TICKS == 1 )
typedef unsigned portSHORT portTickType;
#define portMAX_DELAY ( portTickType ) 0xffff
#else
typedef unsigned portLONG portTickType;
#define portMAX_DELAY ( portTickType ) 0xffffffff
#endif

/*-----------------------------------------------------------*/


/*-----------------------------------------------------------*/

/* Critical section control macros. */
#define portNO_CRITICAL_SECTION_NESTING		( ( unsigned portSHORT ) 0 )

#define portENTER_CRITICAL()													\
{																				\
extern volatile unsigned portSHORT usCriticalNesting;							\
																				\
	portDISABLE_INTERRUPTS();													\
																				\
	/* Now interrupts are disabled usCriticalNesting can be accessed */			\
	/* directly.  Increment ulCriticalNesting to keep a count of how many */	\
	/* times portENTER_CRITICAL() has been called. */							\
	usCriticalNesting++;														\
}

#define portEXIT_CRITICAL()														\
{																				\
extern volatile unsigned portSHORT usCriticalNesting;							\
																				\
	if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING )					\
	{																			\
		/* Decrement the nesting count as we are leaving a critical section. */	\
		usCriticalNesting--;													\
																				\
		/* If the nesting level has reached zero then interrupts should be */	\
		/* re-enabled. */														\
		if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING )				\
		{																		\
			portENABLE_INTERRUPTS();											\
		}																		\
	}																			\
}

/*-----------------------------------------------------------*/

/* Task utilities. */

/* 
 * Manual context switch called by portYIELD or taskYIELD.
 */

extern void vPortYield(void);
#define portYIELD() {\
              UART_DISABLE_BT_UART_RTS();\
              vPortYield();\
        }



/*-----------------------------------------------------------*/

/* Hardware specifics. */
#define portBYTE_ALIGNMENT			2
#define portSTACK_GROWTH			( -1 )
// #define portTICK_RATE_MS ( ( portTickType ) 1000 / configTICK_RATE_HZ )
// this really isn't the case - but it's good enough for this demo...
#define portTICK_RATE_MS			( ( portTickType ) 1 )
#define portNOP()				__no_operation()

/*-----------------------------------------------------------*/

/* Task function macros as described on the FreeRTOS.org WEB site. */
// #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) __task void
// vFunction( void *pvParameters )
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
// #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void
// *pvParameters ) __toplevel
// #define portTASK_FUNCTION( vFunction, pvParameters ) __task void vFunction(
// void *pvParameters )
#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )

/* Compiler specifics. */
/* #define inline _inline */

/* Just used by the demo application to indicate which form of interrupt
 * service routine should be used.  See the online port documentation for more
 * information. */
/* #define MSP_ROWLEY_RB_PORT */

#if configINTERRUPT_EXAMPLE_METHOD == 2

extern void vTaskSwitchContext(void);
#define portYIELD_FROM_ISR( x ) if( x ) vTaskSwitchContext()

#endif /* configINTERRUPT_EXAMPLE_METHOD */

typedef unsigned char BOOLEAN;
typedef unsigned char UINT8;
typedef unsigned char UCHAR;
typedef signed char CHAR;
typedef signed char INT8;

typedef unsigned short int UINT16;
typedef signed short int INT16;

typedef unsigned long int UINT32;
typedef signed long int INT32;

typedef unsigned char OS_BOOL;
typedef INT32 OS_STATUS;
typedef INT32 OS_HANDLE;
typedef void *OS_ADDRESS;

#ifndef _SIZE_T
#define _SIZE_T
typedef __SIZE_T_TYPE__ size_t;
#endif


#undef      OK
#undef      ERROR
#define     OK      ((OS_STATUS)0)
#define     ERROR   ((OS_STATUS)-1)

#undef      TRUE
#undef      FALSE

#define     TRUE    ((OS_BOOL)1)
#define     FALSE   ((OS_BOOL)0)

typedef void (*OS_IDLE_FUNCTION) (void);

typedef void (*OS_TIMEOUT_HANDLER) (OS_HANDLE handle, void *arg);

#include "msp430_uart.h"

/* Macros for error cases */
#define  OS_INVALID_HANDLE      ((OS_HANDLE)-1)
#define  OS_INVALID_VALUE       -1

/* Interrupt control macros. */
#define portDISABLE_INTERRUPTS()	{ \
      __disable_interrupt();\
      UART_DISABLE_BT_UART_RTS();\
}

#define portENABLE_INTERRUPTS()		{ \
    __enable_interrupt(); \
}

#endif /* PORTMACRO_H */
